/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.erp.server;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author Administrator
 */
public class ServletFileDown extends HttpServlet {

    public ServletFileDown() {
    }
    private ServletConfig config;

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        this.config = config;
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException {
        doGet(req, res);
    }


    //取得附件的名称
    public static String getAttachName(String file_name) {
        if (file_name == null) {
            return "";
        }
        file_name = file_name.trim();
        int iPos = 0;
        iPos = file_name.lastIndexOf("\\");
        if (iPos > -1) {
            file_name = file_name.substring(iPos + 1);
        }
        iPos = file_name.lastIndexOf("/");
        if (iPos > -1) {
            file_name = file_name.substring(iPos + 1);
        }
        iPos = file_name.lastIndexOf(File.separator);
        if (iPos > -1) {
            file_name = file_name.substring(iPos + 1);
        }
        return file_name;
    }


    //UTF8转码
    public static String toUtf8String(String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 0 && c <= 255) {
                sb.append(c);
            } else {
                byte[] b;
                try {
                    b = Character.toString(c).getBytes("utf-8");
                } catch (Exception ex) {
                    System.out.println(ex);
                    b = new byte[0];
                }
                for (int j = 0; j < b.length; j++) {
                    int k = b[j];
                    if (k < 0) {
                        k += 256;
                    }
                    sb.append("%" + Integer.toHexString(k).toUpperCase());
                }
            }
        }
        String s_utf8 = sb.toString();
        sb.delete(0, sb.length());
        sb.setLength(0);
        sb = null;
        return s_utf8;
    }
    //取得下载文件的真实全路径名称

    private String getRealName(HttpServletRequest request, String file_name) {
        if (request == null || file_name == null) {
            return null;
        }
        file_name = file_name.trim();
        if (file_name.equals("")) {
            return null;
        }

        String file_path = request.getRealPath(file_name);
        if (file_path == null) {
            return null;
        }
        File file = new File(file_path);
        if (!file.exists()) {
            return null;
        }
        return file_path;
    }
    //实现下载
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        String file_name = request.getParameter("file_name");
        if (file_name == null) {
            file_name = "";
        }
        file_name = file_name.trim();

        InputStream inStream = null;
        String attch_name = "";

        byte[] b = new byte[100];
        int len = 0;
        try {
            //取得附件的名称
            attch_name = getAttachName(file_name);

            file_name = getRealName(request, file_name);
            if (file_name == null) {
                System.out.println("文件不存在,或者禁止下载");
                return;
            }
            attch_name = toUtf8String(attch_name);
            //读到流中
            inStream = new FileInputStream(file_name);
            //设置输出的格式
            response.reset();
            response.setContentType("application/x-msdownload");


            response.addHeader("Content-Disposition", "attachment; filename=\"" + attch_name + "\"");
            //循环取出流中的数据
            while ((len = inStream.read(b)) > 0) {
                response.getOutputStream().write(b, 0, len);
            }
            inStream.close();
        } catch (Exception e) {
            if (e instanceof java.io.FileNotFoundException) {
                try {
                    response.sendRedirect("/tip/file_not_found.html");
                } catch (IOException ex) {
                    ex.printStackTrace(System.err);
                }
            } else {
                e.printStackTrace(System.err);
            }
        }
    }
}
